package com.t.bricks.bussiness.controller.ordersreturned;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.t.bricks.bussiness.controller.common.BaseController;
import com.t.bricks.bussiness.db.entity.ordersreturned.OrdersReturned;
import com.t.bricks.bussiness.service.ordersreturned.OrdersReturnedService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.data.IntegerUtil;
import com.t.bricks.utils.modules.web.FindByPageParam;

/**
 * 订单退货控制层
 * 继承BaseController可直接实现通用方法,三个泛型代表:业务类、实体类、查询类
 * 通用业务类CommonService已经包含常用功能,使用自定义OrdersReturnedService(需实现)可覆盖通用方法或扩展业务功能
 * 通用查询类可以直接使用Map,否则使用自定义ConditionOrdersReturned(需实现)
 * @author HuangXinBian
 * @DateTime 2022年06月22日 15:25:31
 */
@RestController
@Api(value="订单退货", tags={"订单退货操作接口"})
@RequestMapping("/orders/returned/")
public class OrdersReturnedController extends BaseController<OrdersReturnedService<OrdersReturned>, OrdersReturned, Map<String, Object>> {
	
	/**
	 * 控制操作,首位9不参与用6个数代表开关,0为不限制,1为限制
	 * 6个数的控制分别是:删除、修改、查询、导出、统计、步骤值可逆
	 * 其中前5个为'是否仅创建者可操作'后续为其它控制开关
	 */
	protected int enableTag = 9111111;

	/**
	 * 设置 检查待新增内容是否存在重复数据(多字段组合重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatCombination成员,若返回null则不进行重复校验
	 */
	@Override
	protected List<String> setCheckRepeatCombination() {
		return Arrays.asList("sOrderId");
	}

	/**
	 * 设置 检查待新增内容是否存在重复数据(单独字段重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatAlone成员,若返回null则不进行重复校验
	 */
	@Override
	protected Map<String, Integer> setCheckRepeatAlone() {
		return null;
	}

	/**
	 * 删除数据
	 * @param iVersion
	 * @param id 记录编号
	 * @return MsgEmity
	 */
	@RequestMapping(method={RequestMethod.POST}, value="/del")
	@Override
	public MsgEmity del(Integer iVersion, String id) {
		return super.del(iVersion, id);//直接使用父类中定义的方法,否则使用ordersReturnedService.del(iVersion, sId);
	}

	/**
	 * 根据记录编号查询符合分页数据的某条记录
	 * @param id 记录编号
	 * @return MsgEmity
	 */
	@ApiOperation(value="根据记录编号查询符合分页数据的某条记录", response=OrdersReturned.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page/row")
	@Override
	public MsgEmity findByPageRow(String id) {
		return super.findByPageRow(id);//直接使用父类中定义的方法,否则使用ordersReturnedService.findByPageRow(id);
	}

	/**
	 * 查询分页数据
	 * @param findByPageParam 分页查询条件组合类
	 * 结构参考: {"page": 分页请求信息对象, "orders": 排序信息对象集合, "sLikeStr": 全文检索, "condition": 查询条件对象}
	 * @return MsgEmity 返回查询结果
	 */
	@ApiOperation(value="查询分页数据", response=OrdersReturned.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page")
	@Override
	public MsgEmity findByPage(@RequestBody FindByPageParam<Map<String, Object>> findByPageParam) {//findByPage(@RequestBody FindByPageParam<ConditionOrdersReturned> findByPageParam)
		return super.findByPage(findByPageParam);//直接使用父类中定义的方法,否则使用 ordersReturnedService.findByPage(findByPageParam.getPage(), findByPageParam.getOrders(), findByPageParam.getsLikeStr(), findByPageParam.getCondition());
	}

	//---------------------------- 自动生成代码结束 ----------------------------//

	/**
	 * 添加退单
	 * @param sOrderId 订单编号
	 * @Param sMemo 退单描述
	 * @return MsgEmity
	 */
	@ApiOperation(value="进行退单", notes="只有订单所属顾客可以进行")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sOrderId", value="订单编号(非单号)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sMemo", value="退单描述", dataType="String", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/add")
	public MsgEmity addCustom(String sOrderId, String sMemo) {
		return super.service().addCustom(sOrderId, sMemo);
	}

	/**
	 * 审核
	 * @param sId
	 * @param iVersion
	 * @param iVia
	 * @return
	 */
	@ApiOperation(value="退单审核", notes="后台人员操作")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="退单记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="退单记录版本号", dataType="Integer", paramType="query", required=true),
		@ApiImplicitParam(name="iVia", value="是否通过(1:通过)", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/audit")
	public MsgEmity audit(String sId, Integer iVersion, Integer iVia) {
		Integer iState = IntegerUtil.objToInt(iVia, -1).intValue() == 1 ? 3 : 2;
		return super.service().changeState(sId, iState, iVersion);//1:审核中;2:不通过;3:通过;4:已退款;5:已审计;6:完结
	}

	/**
	 * 退款
	 * @param sId
	 * @param iVersion
	 * @return
	 */
	@ApiOperation(value="退单退款", notes="后台人员操作,金额改变需要其它接口")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="退单记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="退单记录版本号", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/refund")
	public MsgEmity refund(String sId, Integer iVersion) {
		return super.service().changeState(sId, 4, iVersion);//1:审核中;2:不通过;3:通过;4:已退款;5:已审计;6:完结
	}

	/**
	 * 审计
	 * @param sId
	 * @param iVersion
	 * @return
	 */
	@ApiOperation(value="退单审计", notes="后台人员操作")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="退单记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="退单记录版本号", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/recheck")
	public MsgEmity recheck(String sId, Integer iVersion) {
		return super.service().changeState(sId, 5, iVersion);//1:审核中;2:不通过;3:通过;4:已退款;5:已审计;6:完结
	}

	/**
	 * 完结
	 * @param sId
	 * @param iVersion
	 * @return
	 */
	@ApiOperation(value="退单完结", notes="后台人员操作")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sId", value="退单记录编号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iVersion", value="退单记录版本号", dataType="Integer", paramType="query", required=true)
	})
	@RequestMapping(method={RequestMethod.POST}, value="/over")
	public MsgEmity over(String sId, Integer iVersion) {
		return super.service().changeState(sId, 6, iVersion);//1:审核中;2:不通过;3:通过;4:已退款;5:已审计;6:完结
	}
	
}
